package middleware

import (
	"github.com/dgrijalva/jwt-go"
	"github.com/gin-gonic/gin"
	"github.com/go-gin-admin/util"
	"net/http"
)

// 校验jwt中间件
func JWTAuthMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 请求前
		//fmt.Println("请求前")
		// 校验用户是否携带合法token
		token := util.GetToken(c)
		if token == "" {
			c.JSON(http.StatusOK, new(util.Response).Err("授权被拒绝，请求中auth为空"))
			c.Abort()
			return
		}

		// 解析token
		mc, err := util.ParseToken(token)
		if err != nil {
			// 判断err类型
			if validationError, ok := err.(*jwt.ValidationError); ok {
				// 断言成功
				switch validationError.Errors { // 判断粗错误类型
				case 16:
					c.JSON(http.StatusOK, new(util.Response).ResData(4001, "token过期", ""))
					c.Abort()
					return
				}
			}

			c.JSON(http.StatusOK, new(util.Response).ResData(4002, "无效token", ""))
			c.Abort()
			return
		}

		// 将当前请求的token解析对象存放到上下文中
		c.Set("token", *mc)
		c.Next()
		// 请求后
		//fmt.Println("请求后")
	}
}
